package br.com.sig.cadastro.pessoas.business.model.entity;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import br.com.sig.business.exception.BaseException;
import br.com.sig.cadastro.pessoas.business.model.enumeration.TipoPessoa;
import br.com.sig.cadastro.recursoshumanos.business.model.enumeration.Departamento;

/**
 * Entity implementation class for Entity: PessoaFisica
 *
 */
@Entity
@Table(schema="sig_cadastro", name="pessoa_juridica")
public class PessoaJuridica extends Pessoa {

	private static final long serialVersionUID = 6048231740303205153L;
	
	private String razaoSocial;
	private String nomeDeFantasia;
	private String site;
	private String cnpj;
	private String inscricaoEstadual;
	private String inscricaoMunicipal;
	private String observacao;
	
	private List<Contato> contatos;
	
	public PessoaJuridica() {
		setTipo(TipoPessoa.JURIDICA);
	}

	@NotNull
	@Column(name = "razao_social", nullable = false)
	public String getRazaoSocial() {
		return razaoSocial;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	@Column(name = "nome_fantasia")
	public String getNomeDeFantasia() {
		return nomeDeFantasia;
	}

	public void setNomeDeFantasia(String nomeDeFantasia) {
		this.nomeDeFantasia = nomeDeFantasia;
	}

	public String getSite() {
		return site;
	}

	public void setSite(String site) {
		this.site = site;
	}

	@NotNull
	@Size(min = 14, max = 14)
	@Column(nullable = false)
	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	@Column(name = "inscricao_estadual")	
	public String getInscricaoEstadual() {
		return inscricaoEstadual;
	}

	public void setInscricaoEstadual(String inscricaoEstadual) {
		this.inscricaoEstadual = inscricaoEstadual;
	}

	@Column(name = "inscricao_municipal")
	public String getInscricaoMunicipal() {
		return inscricaoMunicipal;
	}

	public void setInscricaoMunicipal(String inscricaoMunicipal) {
		this.inscricaoMunicipal = inscricaoMunicipal;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	@NotNull
	@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
	@JoinColumn(name = "pessoa_juridica_id", nullable = false)
	public List<Contato> getContatos() {
		return contatos;
	}

	public void setContatos(List<Contato> contatos) {
		this.contatos = contatos;
	}
	
	@Override
	public void validate() throws BaseException {
		super.validate();
		
		if (getContatos() == null || getContatos().isEmpty()) {
			throw new BaseException("Falha ao incluir uma Pessoa "+ getTipo() +" no sistema. Nenhum contato foi informado.");
		}
		
		if ( !(possuiContatoComercial() && possuiContatoFinanceiro()) ) {
			throw new BaseException("Falha ao incluir uma Pessoa "+ getTipo() +" no sistema. O cadastro precisa de pelo menos um Contato Comercial e um Contato Financeiro.");
		}
	}
	
	public boolean possuiContatoComercial() {
		
		for (Contato contato : getContatos()) {
			if (contato.getDepartamento().getNome().equals(Departamento.COMERCIAL.toString())) {
				return true;
			}
		}
		
		return false;
	}
	
	public boolean possuiContatoFinanceiro() {
		
		for (Contato contato : getContatos()) {
			if (contato.getDepartamento().getNome().equals(Departamento.FINANCEIRO.toString())) {
				return true;
			}
		}
		
		return false;
	}	
	
	@PrePersist
	public void prePersist() {
		if (nomeDeFantasia == null || nomeDeFantasia.isEmpty()) {
			setNomeDeFantasia(getRazaoSocial());
		}
	}
	
}